import { Response, Logger, RequestLogManager } from '../common';
import { DataVerify } from "../common/http/router/dataVerify";

/**
 * ======================
 * resCode [Number]
 * 200 成功
 * 400 用户级别错误
 * 500 服务器级别错误
 * 511 校验级别错误
 */
export function pipe() {
    return async (ctx, next) => {
        try {
            RequestLogManager.Current.LogRequestCtx(ctx);
            ctx = DataVerify.Current.Verify(ctx);
            await next();
            const status = ctx.status || 404;
            if (status === 404) {
                ctx.throw(400);
            } else if (status === 500) {
                ctx.throw(500);
            }
        } catch (err) {
            // AssertionError
            if (err.module && err.module.name == "ServiceException") {
                ctx.body = Response.ServiveException(err);
                return;
            }
            else if (err.module && err.module.name == "AuthenticationException") {
                // ctx.body = Response.AuthenticateException(err);
                // return;
                //TODO: 协定是返回http 的status 401 还是在json中写入。
                err.status = 401;
            }
            else if (err.module && err.module.name == "WebAPIException") {
                ctx.body = Response.ServiveException(err);
                return;
            } else {
                new Logger().getLogger("error").error("app error:", err);
                ctx.body = Response.result(500, err.message, err.stack);
                return;
            }
            // koa : [err.status]
            // mongod : [err.errors]
            const status = err.status || 400
            if (status === 400) {
                ctx.throw(400);
            } else {
                ctx.app.emit('error', err, ctx)
            }
        }
    }
}